
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.capa.view.mbean;

import com.brain.capa.dto.VCapaConsolidadoDto;
import com.brain.capa.dto.VCapaConsolidadoPresupuestoDto;
import com.brain.capa.manager.VCapaConsolidadoManager;
import com.brain.capa.manager.VCapaConsolidadoPresupuestoManager;
import com.brain.capa.view.util.ConstantesCapa;
import com.brain.core.common.UtilCore;
import com.brain.core.view.mbean.*;
import com.brain.core.manager.RecursosManager;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.annotation.Resource;
import net.sf.jasperreports.engine.JRException;
import org.apache.log4j.Logger;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.PieChartModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Hvives
 */
@Controller("reportesCapaMBean")
@Scope("session")
public class ReportesCapaMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(ReportesCapaMBean.class);
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private VCapaConsolidadoManager vCapaConsolidadoManager;
    @Resource
    private VCapaConsolidadoPresupuestoManager vCapaConsolidadoPorMesManager;
    private List<VCapaConsolidadoDto> listaConsolidado;
    private List<VCapaConsolidadoPresupuestoDto> listaConsolidadoPorMes;
    private PieChartModel pieModel;
    private CartesianChartModel pieInversionModel;
    private String keyTitulo = "";
    private int anio = 0;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;

    public ReportesCapaMBean() {
        pieModel = null;
    }

    public String reporteTrimestreCantidad() {
        pieModel = new PieChartModel();
        this.inicializarDatos();
        return ConstantesCapa.UrlNavegacion.URL_RPT_TRIMESTRE_CANTIDAD;
    }

    protected void inicializarDatos() {
        this.listaConsolidado = new ArrayList<VCapaConsolidadoDto>();
        this.anio = UtilCore.Fecha.obtenerAnioActual();
    }

    public void generarReporte2() {
        try {
            double porcentaje = 0;
            this.listaConsolidado = new ArrayList<VCapaConsolidadoDto>();
            int cantidadTotal = this.vCapaConsolidadoManager.obtenerTrimesteCantidadTotal(String.valueOf(this.anio));
            List<VCapaConsolidadoDto> l = this.vCapaConsolidadoManager.obtenerConsolidadoTrimesteCantidadEjecutados(String.valueOf(this.anio));
            for (VCapaConsolidadoDto v : l) {
                porcentaje = v.getCantidad() * 100.00 / cantidadTotal;
                v.setPorcentaje(porcentaje);
                v.setTrimestre(UtilCore.Internacionalizacion.getMensajeInternacional("reporte2.capacitacion.label.ejecutadas") + " " + v.getTrimestre());
                this.listaConsolidado.add(v);
            }
            //Agreamos como columna las capas por ejecutar
            int cantidadPorEjecutar = this.vCapaConsolidadoManager.obtenerTrimesteCantidadPorEjecutar(String.valueOf(this.anio));
            if (cantidadPorEjecutar > 0) {
                VCapaConsolidadoDto dtoAg = new VCapaConsolidadoDto();
                dtoAg.setTrimestre(UtilCore.Internacionalizacion.getMensajeInternacional("reporte2.capacitacion.label.por.ejecutar") + " " + String.valueOf(this.anio));
                porcentaje = cantidadPorEjecutar * 100.00 / cantidadTotal;
                dtoAg.setCantidad(cantidadPorEjecutar);
                dtoAg.setPorcentaje(porcentaje);
                this.listaConsolidado.add(dtoAg);
            }

            //Creamos el PieChart
            if (!this.listaConsolidado.isEmpty()) {
                pieModel = new PieChartModel();
                for (VCapaConsolidadoDto v : this.listaConsolidado) {
                    pieModel.set(v.getTrimestre(), v.getCantidad());
                }
            }

        } catch (Exception ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }

    public String reporteTrimestrePresupuesto() {
        pieModel = new PieChartModel();
        this.inicializarDatos();
        return ConstantesCapa.UrlNavegacion.URL_RPT_TRIMESTRE_PRESUPUESTO;
    }

    public void generarReporte4() {
        try {
            BigDecimal porcentaje = BigDecimal.ZERO;
            this.listaConsolidado = new ArrayList<VCapaConsolidadoDto>();
            BigDecimal inversionTotal = this.vCapaConsolidadoManager.obtenerTrimesteInversionTotal(String.valueOf(this.anio));
            System.out.println(inversionTotal);
            List<VCapaConsolidadoDto> l = this.vCapaConsolidadoManager.obtenerConsolidadoTrimesteInversionEjecutados(String.valueOf(this.anio));
            for (VCapaConsolidadoDto v : l) {
                porcentaje = UtilCore.Numero.porcentaje(v.getInversion(), inversionTotal);

                v.setPorcentajeInversion(porcentaje);
                v.setTrimestre(UtilCore.Internacionalizacion.getMensajeInternacional("reporte4.capacitacion.label.ejecutadas") + " " + v.getTrimestre());
                this.listaConsolidado.add(v);
            }
            //Agreamos como columna las capas por ejecutar
            BigDecimal inversionPorEjecutar = this.vCapaConsolidadoManager.obtenerTrimesteInversionPorEjecutar(String.valueOf(this.anio));
            if (inversionPorEjecutar.compareTo(BigDecimal.ZERO) > 0) {
                VCapaConsolidadoDto dtoAg = new VCapaConsolidadoDto();
                dtoAg.setTrimestre(UtilCore.Internacionalizacion.getMensajeInternacional("reporte4.capacitacion.label.por.ejecutar") + " " + String.valueOf(this.anio));
                porcentaje = UtilCore.Numero.porcentaje(inversionPorEjecutar, inversionTotal);
                dtoAg.setInversion(inversionPorEjecutar);
                dtoAg.setPorcentajeInversion(porcentaje);
                this.listaConsolidado.add(dtoAg);
            }

            if (!this.listaConsolidado.isEmpty()) {
                pieModel = new PieChartModel();
                for (VCapaConsolidadoDto v : this.listaConsolidado) {
                    pieModel.set(v.getTrimestre(), v.getInversion());
                }
            }

        } catch (Exception ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }

    public String reporteCumplimiento() {
        this.inicializarDatos();
        return ConstantesCapa.UrlNavegacion.URL_RPT_CUMPLIMIENTO;
    }

    public void generarReporte5() {
        try {
            BigDecimal porcentaje = BigDecimal.ZERO;
            this.listaConsolidado = this.vCapaConsolidadoManager.obtenerResumenInversionPorArea(String.valueOf(this.anio));
            for (VCapaConsolidadoDto v : this.listaConsolidado) {
                porcentaje = UtilCore.Numero.porcentaje(v.getInversionEjecutada(), v.getInversionAsignada());
                v.setPorcentajeInversion(porcentaje);
            }
        } catch (Exception ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }

    public String reporteEjecucion() {
        this.inicializarDatos();
        return ConstantesCapa.UrlNavegacion.URL_RPT_EJECUCION;
    }

    public String generarReporte1() {
        try {
            String nombreArchivoReporte = "SGC_EJECUCION_CAPACITACIONES_ANIO_" + this.anio;
            HashMap parametros = new HashMap();
            parametros.put("P_ANIO", String.valueOf(this.anio));
            recursosManager.viewReportePdf(parametros, "RptCapaAgrupadoPorMes", nombreArchivoReporte);
            return null;
        } catch (FileNotFoundException ex) {
            showError("EL ARCHIVO NO SE ENCUENTRA");
            logger.error(ex);
        } catch (JRException ex) {
            logger.error(ex);
            showError("ERROR EN LA COMPILACIÓN DEL REPORTE");
        } catch (IOException ex) {
            showError("EL ARCHIVO ESTÁ DAÑADO");
            logger.error(ex);
        } catch (SQLException ex) {
            logger.error(ex);
            showError("ERROR EN LA CONSULTA DEL REPORTE");
        } finally {
            return null;
        }
    }

    public String reportePresupuesto() {
        this.inicializarDatos();
        return ConstantesCapa.UrlNavegacion.URL_RPT_PRESUPUESTO;
    }

    public void generarReporte3() {
        try {
            this.listaConsolidadoPorMes = this.vCapaConsolidadoPorMesManager.obtenerResumenIversion(String.valueOf(this.anio));
        } catch (Exception ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
    }

    public List<VCapaConsolidadoDto> getListaConsolidado() {
        return listaConsolidado;
    }

    public void setListaConsolidado(List<VCapaConsolidadoDto> listaConsolidado) {
        this.listaConsolidado = listaConsolidado;
    }

    public List<VCapaConsolidadoPresupuestoDto> getListaConsolidadoPorMes() {
        return listaConsolidadoPorMes;
    }

    public void setListaConsolidadoPorMes(List<VCapaConsolidadoPresupuestoDto> listaConsolidadoPorMes) {
        this.listaConsolidadoPorMes = listaConsolidadoPorMes;
    }

    public int getAnio() {
        return anio;
    }

    public void setAnio(int anio) {
        this.anio = anio;
    }

    public PieChartModel getPieModel() {
        return pieModel;
    }

    public CartesianChartModel getPieInversionModel() {
        return pieInversionModel;
    }

    public void setPieInversionModel(CartesianChartModel pieInversionModel) {
        this.pieInversionModel = pieInversionModel;
    }
}
